<?php

class Cotizacion_Model extends CI_Model {
    const STR_NOMBRE_TABLA = 'cotizacion';
    const STR_NOMBRE_TABLA_SOLICITUD = 'solicitud';
    const STR_NOMBRE_TABLA_MARCA = 'marca';    
    const STR_NOMBRE_TABLA_MODELO = 'modelo';
    const STR_NOMBRE_TABLA_ESTADO_REP = 'estado_repuesto';
    const STR_NOMBRE_TABLA_REPUESTO = 'repuesto';
    const STR_NOMBRE_TABLA_REP_X_COTIZACION = 'cotizacion_repuesto_solicitud';
    const STR_NOMBRE_TABLA_REP_X_SOLICITUD = 'repuesto_solicitud';
    const STR_NOMBRE_TABLA_CLIENTE = 'usuario';
    const STR_NOMBRE_TABLA_PROVEEDOR = 'usuario';
    const STR_NOMBRE_TABLA_PERSONA = 'persona';    
    const STR_NOMBRE_TABLA_PERSONA_JURIDICA = 'persona_juridica';    
    const STR_NOMBRE_TABLA_MONEDA = 'tabla_maestra tm1';
    const STR_NOMBRE_TABLA_ESTADO = 'tabla_maestra tm2';    
    const STR_NOMBRE_TABLA_TALLER = 'tabla_maestra tm3';
    const STR_NOMBRE_TABLA_USUARIO_CLIENTE = 'usuario cl';
    const STR_NOMBRE_TABLA_USUARIO_PROVEEDOR = 'usuario pr';
    const STR_NOMBRE_TABLA_PERSONA_CLIENTE = 'persona pcl';
    const STR_NOMBRE_TABLA_PERSONA_PROVEEDOR = 'persona ppr';

    function __construct() {
        parent::__construct();
    }

    /**
     * Obtener la información de una cotización.
     * @author Fernando Esteban Valerio
     * @param int $idCotizacion Id Cotizacion
     * @return array
     */
    public function getCotizacion($idCotizacion) {
        $this->db->where('id_cotizacion', $idCotizacion);
        $query = $this->db->get(self::STR_NOMBRE_TABLA);
    	return $query->result();
    }
    
    /**
     * Obtener las cotizaciones en estado COTIZADA asociadas a una solicitud.
     * @author Fernando Esteban Valerio
     * @param int $idSolicitud Id Solicitud
     * @param int $idEstado Id Estado de la cotizacion
     * @return array
     */
    public function getCotizacionCotizadas($idSolicitud, $idEstado) {
        $this->db->where('id_solicitud', $idSolicitud);
        $this->db->where('id_estado', $idEstado);
        $query = $this->db->get(self::STR_NOMBRE_TABLA);
    	return $query->result();
    }

    /**
     * Validar si existe el numero de caso.
     * @param int $idSolicitud Id Solicitud
     * @param int $idEstado Id Estado de la cotizacion
     * @param int $idProveedor Id del usuario
     * @return array
     */
    public function validarNumCaso($idSolicitud, $idEstado=0, $idProveedor=0) {
        $this->db->where('id_solicitud', $idSolicitud);
        if ($idEstado) {
            $this->db->where('id_estado', $idEstado);
        }
        if ($idProveedor) {
            $this->db->where('id_usuario', $idProveedor);
        }
        $query = $this->db->get(self::STR_NOMBRE_TABLA);
    	return $query->result();
    }
    
    /**
     * Obtener los proveedores interesados en las cotizaciones asociadas a una
     * solicitud.
     * @author Fernando Esteban Valerio
     * @param int $idSolicitud Id Solicitud
     * @param int $idEstado Id Estado de la cotizacio
     * @return array
     */
    public function getProveedoresInteresados($idSolicitud, $idEstado) {
        $this->db->select("COUNT(cotizacion.me_gusta) AS total");
        $this->db->from(self::STR_NOMBRE_TABLA);        
        $this->db->where('cotizacion.id_solicitud', $idSolicitud);
        $this->db->where('cotizacion.id_estado', $idEstado);
        $this->db->where('cotizacion.me_gusta', 1);        
        $query = $this->db->get();
        return $query->result();
    }
    
    /**
     * Obtener la información del cliente y proveedor asociado a una cotización.
     * @author Fernando Esteban Valerio
     * @param int $idCotizacion Id cotizacion
     * @return array
     */
    public function getInfoClienteYProveedor($idCotizacion) {
        $this->db->select("
                solicitud.id_solicitud AS id_solicitud,
                solicitud.id_usuario AS id_cliente,
                solicitud.igv AS igv,
                solicitud.id_moneda AS id_moneda,
                cotizacion.id_cotizacion AS id_cotizacion,
                cotizacion.id_usuario AS id_proveedor,
                cotizacion.me_gusta AS me_gusta,
                pcl.id_persona AS id_persona,
                pcl.correo AS correo,
                pcl.id_tipo_cliente AS id_tipo_cliente,
                ppr.id_persona AS id_persona_proveedor,
                ppr.correo AS correo_proveedor");
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_SOLICITUD, "solicitud.id_solicitud = cotizacion.id_solicitud");        
        $this->db->join(self::STR_NOMBRE_TABLA_USUARIO_CLIENTE, "cl.id_usuario = solicitud.id_usuario");
        $this->db->join(self::STR_NOMBRE_TABLA_USUARIO_PROVEEDOR, "pr.id_usuario = cotizacion.id_usuario");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA_CLIENTE, "pcl.id_persona = cl.id_persona");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA_PROVEEDOR, "ppr.id_persona = pr.id_persona");
        $this->db->where('cotizacion.id_cotizacion', $idCotizacion);
        $query = $this->db->get();
        return $query->result();
    }
    
    /**
     * Obtener el detalle de los repuestos asociados a una cotizacion para todos
     * los proveedores.
     * @author Fernando Esteban Valerio
     * @param int $idSolicitud Id solicitud
     * @return array
     */
    public function getDetRepuestoXProveedor($idSolicitud) {
        $this->db->select("
            cotizacion.id_usuario AS idProveedor,persona_juridica.razon_social AS razon,
            repuesto.nombre AS nomRepuesto,repuesto_solicitud.tipo AS tipo,
            cotizacion_repuesto_solicitud.cantidad AS cantidad,cotizacion_repuesto_solicitud.precio AS monto,
            cotizacion_repuesto_solicitud.disponibilidad AS disponibilidad,tm2.valor_1 AS nomEstado");
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_REP_X_COTIZACION, "cotizacion_repuesto_solicitud.id_cotizacion = cotizacion.id_cotizacion");        
        $this->db->join(self::STR_NOMBRE_TABLA_REPUESTO, "repuesto.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto");
        $this->db->join(self::STR_NOMBRE_TABLA_REP_X_SOLICITUD, "repuesto_solicitud.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto AND repuesto_solicitud.id_solicitud = cotizacion_repuesto_solicitud.id_solicitud");
        $this->db->join(self::STR_NOMBRE_TABLA_ESTADO, "tm2.id_tabla_maestra = repuesto_solicitud.id_estado");
        $this->db->join(self::STR_NOMBRE_TABLA_CLIENTE, "usuario.id_usuario = cotizacion.id_usuario");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA, "persona.id_persona = usuario.id_persona");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA_JURIDICA, "persona_juridica.id_persona = persona.id_persona");
        $this->db->where('cotizacion.id_solicitud', $idSolicitud);
        $this->db->order_by('cotizacion.id_usuario', 'DESC');
        $query = $this->db->get();
        return $query->result();
    }
    
    public function getProveedoresAPagar($idSolicitud) {
        $query = "SELECT cotizacion.id_usuario AS idProveedor "
               . "FROM " . self::STR_NOMBRE_TABLA .", " . self::STR_NOMBRE_TABLA_REP_X_COTIZACION . ", " . self::STR_NOMBRE_TABLA_PROVEEDOR . " WHERE "
               . "cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion AND cotizacion.id_usuario = usuario.id_usuario AND "
               . "cotizacion.id_solicitud = '" . $idSolicitud . "' AND cotizacion_repuesto_solicitud.seleccionado = 1 "
               . "GROUP BY cotizacion.id_usuario";
        $query = $this->db->query($query);
    	return $query->result();
    }
    
    /**
     * Obtener las cotizaciones para un proveedor determinado (Bandeja de Cotizaciones - Proveedor).
     * @author Fernando Esteban Valerio
     * @param int $idProveedor Id usuario
     * @return array
     */
    function getListCotizacionBandeja($idProveedor) {
        $this->db->select("
                solicitud.id_solicitud AS id_solicitud,solicitud.fecha_registro AS fecha_registro,tm1.valor_1 AS nomMoneda,
                solicitud.placa AS placa,marca.nombre AS nomMarca,modelo.nombre AS nomModelo,solicitud.ano AS anho,tm3.valor_1 AS nomTaller,
                solicitud.otro_taller AS otroTaller,cotizacion.id_cotizacion AS id_cotizacion,solicitud.igv AS igv,
                cotizacion.id_estado AS idEstadoCot,tm2.valor_1 AS nomEstadoCot");
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_SOLICITUD, "solicitud.id_solicitud = cotizacion.id_solicitud");
        $this->db->join(self::STR_NOMBRE_TABLA_MONEDA, "solicitud.id_moneda = tm1.id_tabla_maestra");
        $this->db->join(self::STR_NOMBRE_TABLA_MODELO, "solicitud.id_modelo = modelo.id_modelo");
        $this->db->join(self::STR_NOMBRE_TABLA_MARCA, "marca.id_marca = modelo.id_marca");
        $this->db->join(self::STR_NOMBRE_TABLA_TALLER, "solicitud.id_taller = tm3.id_tabla_maestra");
        $this->db->join(self::STR_NOMBRE_TABLA_ESTADO, "cotizacion.id_estado = tm2.id_tabla_maestra");
        $this->db->join(self::STR_NOMBRE_TABLA_PROVEEDOR, "cotizacion.id_usuario = usuario.id_usuario");
        $this->db->where('cotizacion.id_usuario', $idProveedor);
        $this->db->order_by('cotizacion.fecha_registro', 'DESC');
        $query = $this->db->get();
        return $query->result();
    }
    
    /**
     * Obtener las cotizaciones registradas en el sistema (Bandeja de Cotizaciones - Administrador).
     * @author Fernando Esteban Valerio
     * @return array
     */
    function getListCotizacion() {
        $this->db->select("
                solicitud.id_solicitud AS id_solicitud,solicitud.fecha_registro AS fecha_registro,tm1.valor_1 AS nomMoneda,
                solicitud.placa AS placa,marca.nombre AS nomMarca,modelo.nombre AS nomModelo,solicitud.ano AS anho,tm3.valor_1 AS nomTaller,
                cotizacion.id_cotizacion AS id_cotizacion,solicitud.igv AS igv,cotizacion.id_estado AS idEstadoCot,tm2.valor_1 AS nomEstadoCot,
                cotizacion.comentario AS comentario,cotizacion.id_usuario AS id_usuario,persona_juridica.razon_social AS razon");
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_SOLICITUD, "solicitud.id_solicitud = cotizacion.id_solicitud");
        $this->db->join(self::STR_NOMBRE_TABLA_MONEDA, "solicitud.id_moneda = tm1.id_tabla_maestra");
        $this->db->join(self::STR_NOMBRE_TABLA_MODELO, "solicitud.id_modelo = modelo.id_modelo");
        $this->db->join(self::STR_NOMBRE_TABLA_MARCA, "marca.id_marca = modelo.id_marca");
        $this->db->join(self::STR_NOMBRE_TABLA_TALLER, "solicitud.id_taller = tm3.id_tabla_maestra");
        $this->db->join(self::STR_NOMBRE_TABLA_ESTADO, "cotizacion.id_estado = tm2.id_tabla_maestra");
        $this->db->join(self::STR_NOMBRE_TABLA_PROVEEDOR, "cotizacion.id_usuario = usuario.id_usuario");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA, "persona.id_persona = usuario.id_persona");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA_JURIDICA, "persona_juridica.id_persona = persona.id_persona");
        $this->db->order_by('cotizacion.fecha_registro', 'DESC');
        $query = $this->db->get();
        return $query->result();
    }
       
    /**
     * Registrar la informacion de una cotizacion.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo de datos de la cotizacion
     */
    function insert($data){
        $this->db->set('id_solicitud', $data['id_solicitud']);
    	$this->db->set('id_usuario', $data['id_usuario']);
        $this->db->set('id_estado', $data['id_estado']);
        $this->db->set('usuario_registro', $data['usuario_registro']);
        $this->db->set('fecha_registro', $data['fecha_registro']);
    	$this->db->insert(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Actualizar el indicador "me gusta" para una cotizacion.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo de datos de la cotizacion
     */
    function updateMeGusta($data) {
        $this->db->set('me_gusta', $data['me_gusta']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);
        $this->db->where('id_cotizacion', $data['id_cotizacion']);
    	$this->db->update(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Actualizar el estado de una cotizacion.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo de datos de la cotizacion
     */
    function updateEstado($data) {
        $this->db->set('id_estado', $data['estado']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);
        $this->db->where('id_cotizacion', $data['id_cotizacion']);
    	$this->db->update(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Devolver el id insertado.
     * @author Fernando Esteban Valerio
     * @return int
     */
    function getLastInserted(){        
        return $this->db->insert_id();
    }
    
    /**
     * Muestra las cotizaciones que estan con estado cotizadas o no cotizadas
     * para sacar informacion del cliente y su tipo se unio con las tablas
     * persona_juridica y persona_natural a la vez
     * @author Leidy Uribe Marcos*/
    function getCotizacionReporte() {
    	$solicitud = $this->db->query('
                        SELECT distinct solicitud.id_solicitud AS id_solicitud, 
    			persona.id_tipo_cliente AS tipCliente, solicitud.id_usuario AS id_cliente,
    			solicitud.fecha_registro AS fecha_registro, tmoneda.nombre AS nomMoneda, 
    			igv AS igv, marca.nombre AS nomMarca, modelo.nombre AS nomModelo, 
    			solicitud.id_estado AS estado, persona_natural.nombres AS nombre,
    			persona_natural.apellidos AS apellidos, ttaller.nombre AS taller,  testado.valor_2 AS indicador
FROM cotizacion, solicitud, tabla_maestra tmoneda, tabla_maestra ttaller, tabla_maestra testado,
    			cotizacion_repuesto_solicitud, persona, marca, modelo, persona_natural, usuario, tabla_maestra
WHERE solicitud.id_solicitud = cotizacion.id_solicitud AND
cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion AND
testado.id_tabla_maestra = solicitud.id_estado AND
modelo.id_marca = marca.id_marca AND
solicitud.id_moneda = tmoneda.id_tabla_maestra AND
solicitud.id_modelo = modelo.id_modelo AND
solicitud.id_taller = ttaller.id_tabla_maestra AND
(tabla_maestra.id_tabla_maestra BETWEEN 11 AND 19) AND
solicitud.id_usuario = usuario.id_usuario AND
usuario.id_persona = persona.id_persona AND
persona_natural.id_persona = persona.id_persona
union all
SELECT distinct solicitud.id_solicitud AS id_solicitud, persona.id_tipo_cliente AS tipCliente, 
    			solicitud.id_usuario AS id_cliente,solicitud.fecha_registro AS fecha_registro, 
    			tmoneda.nombre AS nomMoneda, igv AS igv, marca.nombre AS nomMarca, 
    			modelo.nombre AS nomModelo, solicitud.id_estado AS estado, 
    			persona_juridica.razon_social AS razon, persona_juridica.ruc AS ruc, 
    			ttaller.nombre AS taller, testado.valor_2 AS indicador
FROM cotizacion, solicitud, tabla_maestra tmoneda, tabla_maestra ttaller, tabla_maestra testado,
    			cotizacion_repuesto_solicitud, persona, marca, modelo, persona_juridica, usuario, tabla_maestra
WHERE solicitud.id_solicitud = cotizacion.id_solicitud AND
cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion AND
testado.id_tabla_maestra = solicitud.id_estado AND
modelo.id_marca = marca.id_marca AND
solicitud.id_moneda = tmoneda.id_tabla_maestra AND
solicitud.id_modelo = modelo.id_modelo AND
solicitud.id_taller = ttaller.id_tabla_maestra AND
(tabla_maestra.id_tabla_maestra BETWEEN 11 AND 19) AND
solicitud.id_usuario = usuario.id_usuario AND
usuario.id_persona = persona.id_persona AND
persona_juridica.id_persona = persona.id_persona');
    	return $solicitud->result();
    }
    
    /**
     * Se muestra el detalle de una cotizacion elegida
     * @author Leidy Uribe Marcos
     */
    function getCotizacionReporteDetalle($id) {
    	$solicitud = $this->db->query('SELECT cotizacion_repuesto_solicitud.id_solicitud AS id_solicitud,
    			cotizacion_repuesto_solicitud.total AS total, solicitud.fecha_registro AS fecha_entrega,
    			repuesto.nombre AS repuesto, repuesto_solicitud.numero_parte AS parte, repuesto_solicitud.tipo AS tipo,
    			cotizacion_repuesto_solicitud.cantidad AS cantidad, cotizacion_repuesto_solicitud.precio AS precio
    			
    			FROM cotizacion_repuesto_solicitud, repuesto_solicitud, repuesto, solicitud
    			WHERE cotizacion_repuesto_solicitud.id_solicitud = repuesto_solicitud.id_solicitud AND
    			cotizacion_repuesto_solicitud.id_solicitud = solicitud.id_solicitud AND
    			cotizacion_repuesto_solicitud.id_repuesto = repuesto_solicitud.id_repuesto AND
    			cotizacion_repuesto_solicitud.id_repuesto = repuesto.id_repuesto AND
    			cotizacion_repuesto_solicitud.seleccionado = 1 AND
    			cotizacion_repuesto_solicitud.id_solicitud =' . $id);
    	return $solicitud->result();   
    }
}